#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>

//练习1：
//计算一个无符号整数的每一位之和
//int DigitSum(unsigned int n)
//{
//    if (n > 9)
//    {
//        return DigitSum(n % 10) + DigitSum(n / 10);//
//    }
//    else
//    {
//        return n;//
//    }
//}

// s(12345)
// s(1234)                         + 12345%10
// s(123)                + 1234%10 + 12345%10
// s(12)        + 123%10 + 1234%10 + 12345%10
// s(1) + 12%10 + 123%10 + 1234%10 + 12345%10
//int main()
//{
//    unsigned int n = 0;//
//    scanf("%u", &n);//
//    int sum = DigitSum(n);//
//    printf("%d\n", sum);// 
//    return 0;//
//}
//
//练习2：
//求n的k次方
//double Pow(int n, int k)
//{
//    if (k >= 1)
//    {
//        return n * Pow(n, k - 1);//
//    }
//    else if (k == 0)
//    {
//        return 1;//
//    }
//    else
//    {
//        return 1.0 / Pow(n, -k);//
//    }
//}
// p(2, 3)
// p(2, 2)          * 2
// p(2, 1)      * 2 * 2
// p(2, 0)  * 2 * 2 * 2

// p(2, -3)
// p(2, -2)                * 1 / 2
// p(2, -1)        * 1 / 2 * 1 / 2
// p(2, 0) * 1 / 2 * 1 / 2 * 1 / 2

//int main()
//{
//    int n = 0;//
//    int k = 0;//
//    scanf("%d%d", &n, &k);//
//    double r = Pow(n, k);//
//    printf("%lf\n", r);//
//    return 0;//
//}

#include <string.h>

//练习3：字符串逆序
//下面采用三种方法，
//Method1: 记录下标，利用while(left < right){} 循环进行交换
//int main()
//{
//    char arr[] = "abcdefg";//
//    int sz = sizeof(arr) / sizeof(arr[0]);//或者不用sizeof 
//    //求字符串长度可以依靠strlen，strlen既要看到\0，又不把\0记入返回值
//    int left = 0;//
//    int right = sz - 2;//这句可改成int right = strlen (arr) - 1，
//    //right记录的是最后一个非'\0'字符的下标，所以需要减一
//    while (left < right)
//    {
//        int tmp;//
//        tmp = arr[left];//
//        arr[left] = arr[right];//
//        arr[right] = tmp;//
//        left++;//
//        right--;//
//    }
//    printf("%s\n", arr);//
//    return 0;//
//}

//Method2: 利用递归实现
//void reverse(char* str)
//{
//    char tmp = *str;//第一步，将当前字符串的第一个字符给临时变量tmp
//    int len = strlen(str);//求出当前的字符串个数
//    *str = *(str + len - 1);//第二步，将字符串中最后一个字符给字符串的第一个字符
//    *(str + len - 1) = '\0';//第三步，将字符串的最后一个字符先置为'\0'
//    if (strlen(str + 1) >= 2)//要使用递归，必须对调用本函数的次数加以限制
//    {
//        reverse(str + 1);
//    }
//     每次在reverse里调用reverse时，都要经过第一、二、三步
//     要使用递归，必须在调用之后不断接近这个限制条件
//     //且只要这次strlen (str + 1) >= 2判断语句返回值为真
//     //在下一次调用时传入的字符串首元素地址是这一次字符串首元素地址加一以后的结果
//     //而且下一次strlen (str)得到的结果是这一次strlen (str)的值减一
//    *(str + len - 1) = tmp;
//
//    当某次strlen (str + 1) >= 2判断语句返回值为假
//    //开始将当前次数对应的字符放回到当前次数对应的字符串末尾
//}
//int main()
//{
//    char arr[] = "abcdefg";//
//    reverse(arr);//
//    printf("%s\n", arr);//
//    return 0;//
//}

//Method3: 指针做形参，实现递归
//void reverse(char arr[], int left, size_t right)
//{
//    if (left < right)
//    {
//        char tmp = arr[left];//
//        arr[left] = arr[right];//
//        arr[right] = tmp;//
//        reverse(arr, left + 1, right - 1);
//        在使用递归的时候有时候需要考虑
//        //函数内部的执行需将限制条件的判断放在什么位置
//    }
//}
//int main()
//{
//    char arr[] = "abcdefg";//
//    int left = 0;//
//    size_t right = strlen(arr) - 1;//
//    reverse(arr, left, right);//
//    printf("%s\n", arr);//
//    return 0;//
//}

